package com.outdoor.handler;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 自定义类型处理器，处理字符串与List<String>之间的转换
 */
@Slf4j
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class JsonTypeHandler extends BaseTypeHandler<List<String>> {

    private static final ObjectMapper MAPPER = new ObjectMapper();

    /**
     * Java对象转换成数据库需要的格式
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
        try {
            if (parameter != null && !parameter.isEmpty()) {
                String jsonString = MAPPER.writeValueAsString(parameter);
                ps.setString(i, jsonString);
            } else {
                ps.setString(i, "[]");
            }
        } catch (JsonProcessingException e) {
            log.error("List转换JSON出错", e);
            ps.setString(i, "[]");
        }
    }

    /**
     * 数据库数据转换成Java对象
     * - 如果数据库字段是JSON格式: ["item1","item2"]，使用jackson解析
     * - 如果数据库字段是逗号分隔的字符串: item1,item2，使用split方法解析
     */
    @Override
    public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return convertToList(rs.getString(columnName));
    }

    @Override
    public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return convertToList(rs.getString(columnIndex));
    }

    @Override
    public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return convertToList(cs.getString(columnIndex));
    }

    /**
     * 智能转换字符串为List
     * - 支持JSON数组格式
     * - 支持逗号分隔的字符串格式
     */
    private List<String> convertToList(String value) {
        if (value == null || value.trim().isEmpty()) {
            return Collections.emptyList();
        }

        // 尝试作为JSON解析
        if (value.trim().startsWith("[")) {
            try {
                return MAPPER.readValue(value, List.class);
            } catch (Exception e) {
                log.warn("解析JSON失败，尝试作为逗号分隔的字符串处理: {}", value);
            }
        }

        // 作为逗号分隔的字符串处理
        return Arrays.stream(value.split(","))
                .map(String::trim)
                .filter(s -> !s.isEmpty())
                .collect(Collectors.toList());
    }
} 